Java Collection浅析

Java 的容器部分,在各大Java畅销书中都占有非常重要的地位。在写Java代码的时候,几乎每次都会用到Java的collection,包里面这么多类,各种关系纠结,因此有必要好好研究下。

下面是摘录网上的对Java 容器的定义:

Java容器类包含List、ArrayList、Vector及map、HashTable、HashMap、Hashset

ArrayList和HashMap是异步的,Vector和Hashtable是同步的,所以Vector和Hashtable是线程安全的,而ArrayList和HashMap并不是线程安全的。

先上个图:

Java Collection

简单描绘了关系,此处都是接口,这里从数据结构上来讲,一目了然,list 是链表, set是集合,map是字典,区别很明显。

图二:

Java Collection List Set

这里描述 Set 和List 的基本层次关系。

List<Class> arrayList = new ArrayList<Class>;
arrayList.add(obj1);
arrayList.add(obj2);
arrayList.add(obj3);

List<Class> linkedList = new LinkedList<Class>;
linkedList.add(obj1);
linkedList.add(obj2);
linkedList.add(obj3);

以上代码,两种list,看名字,ArrayList 是数组, LinkedList 是链表

ArrayList 连续内存,读取肯定更快,写入就不行了,因为要移动元素,随机访问高效。ArrayList 被设计为可动态增长的list,高效的数组。

LinkedList 是双向链表,每个元素带指针,内存不连续,写入相对方便。

看看有点像Python的tuple 和 list, tuple干脆就不支持写入了。。。

Set<Class> hashset = new HashSet<Class>;
hashset.add(obj1);
hashset.add(obj2);
hashset.add(obj3);

Set<Class> treeset = new TreeSet<Class>;
treeset.add(obj1);
treeset.add(obj2);
treeset.add(obj3);

Set 即是集合, HashSet 是无序集合。TreeSet 是有序集合,数据结构为 红-黑 树

LinkedHashSet 比较特别,继承 HashSet, 实现了 Set 接口,底层使用LinkedHashMap保存数据。深入参考请移步 http://zhangshixi.iteye.com/blog/673319

图Map:

Java Collection Map

Map 就是映射、字典。

简单描述下:

HashMap 以 hash table 实现,key 或 value 都无排序

TreeMap 从数据结构上说是 红-黑 树,以 key 作为排序

LinkedHashMap 保存插入排序

Hashtable 是同步的

HashMap<Class> hashmap = new HashMap<Class>;
TreeMap<Class> hashmap = new TreeMap<Class>;
LinkedHashMap<Class> hashmap = new LinkedHashMap<Class>;